package br.com.virtual.replicar.service;

import java.util.Map;
import java.util.TreeMap;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;

import br.com.virtual.base.enums.ActionFormEnum;
import br.com.virtual.replicar.dao.impl.VirtualModelReplicacaoDAO;
import br.com.virtual.replicar.model.Sincronizar;
import br.com.virtual.replicar.model.VirtualModelReplicacao;

@Stateless
public class ReplicadorGravadorEntidade {

	@EJB
	ReplicadorPreparadorEntidade rplPreparadorEntidade;

	@Inject
	VirtualModelReplicacaoDAO replicacaoDAO;

	@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
	public void executarAcaoEntidades(
			TreeMap<Sincronizar, VirtualModelReplicacao> itensReplicar) {

		try {
			// ROTINA PARA GRAVAÇÃO.
			for (Map.Entry<Sincronizar, VirtualModelReplicacao> entry : itensReplicar
					.entrySet()) {

				boolean sucessoOperacao = true;

				if (entry.getKey().getAcao().equals(ActionFormEnum.CREATE)) {

					if (!doCreate(entry.getValue()))
						sucessoOperacao = false;

				} else if (entry.getKey().getAcao()
						.equals(ActionFormEnum.UPDATE)) {

					if (!doUpdate(entry.getValue()))
						sucessoOperacao = false;

				} else if (entry.getKey().getAcao()
						.equals(ActionFormEnum.DELETE)) {

					if (!doDelete(entry.getValue(), entry.getKey()
							.getIdEntidade()))
						sucessoOperacao = false;
				}

				// NOTIFICAR SUCESSO PARA EXCLUSÃO.
				if (sucessoOperacao)
					rplPreparadorEntidade
							.removerItemSincronizar(entry.getKey());
			}

		} catch (Exception e) {

		}

		// EXECUTADO PARA TESTE
		// System.out.println("FIMMMM - executarAcaoEntidades");

		ReplicadorPreparadorEntidade.sincronizando = false;
	}

	private boolean doCreate(VirtualModelReplicacao virtualReplicationModel) {
		return replicacaoDAO.create(virtualReplicationModel);
	}

	private boolean doDelete(VirtualModelReplicacao virtualReplicationModel,
			Long id) {
		return replicacaoDAO.delete(virtualReplicationModel, id);
	}

	private boolean doUpdate(VirtualModelReplicacao virtualReplicationModel) {

		return replicacaoDAO.update(virtualReplicationModel);
	}

}
